<?php
// /tmp/epg_filter.php

$inputGz = 'http://e.erw.cc/all.xml.gz';
//$inputGz = 'http://e.erw.cc/e.xml.gz';
$outputGz = '/www/epg_filtered.xml.gz';
$allowedChannels = [
    'CCTV', 'CCTV1', 'CCTV2', 'CCTV3', 'CCTV4', 'CCTV4欧洲', 'CCTV4美洲', 'CCTV5', 'CCTV5', 'CCTV6', 'CCTV7', 'CCTV8',
    'CCTV9', 'CCTV10', 'CCTV11', 'CCTV12', 'CCTV13', 'CCTV14', 'CCTV15', 'CCTV17', 'CGTN', 'CGTN纪录', 'CGTN西语',
    'CGTN法语', 'CGTN阿语', 'CGTN俄语', 'CCTV4K', '北京卫视4K', '深圳卫视4K', '广东卫视4K', '河南卫视4K', 'CHC家庭影院',
    'CHC动作电影', 'CHC影迷电影', '爱上4k', '经典电影', '精选频道', '魅力时尚', '热播剧场', '谍战剧场', '爱电影',
    '爱大剧', 'CCTV14', '卡酷少儿', '金鹰卡通', '嘉佳卡通', '少儿动画', '新动漫', '湖南卫视', '江苏卫视', '浙江卫视',
    '北京卫视', '东方卫视', '天津卫视', '山东卫视', '安徽卫视', '深圳卫视', '江西卫视', '湖北卫视', '四川卫视',
    '黑龙江卫视', '云南卫视', '贵州卫视', '辽宁卫视', '东南卫视', '重庆卫视', '广东卫视', '广西卫视', '河北卫视',
    '吉林卫视', '山西卫视', '陕西卫视', '甘肃卫视', '宁夏卫视', '青海卫视', '内蒙古卫视', '西藏卫视', '新疆卫视',
    '厦门卫视', '三沙卫视', '海南卫视', '金鹰纪实', '兵团卫视', '河南卫视', '河南都市', '河南民生', '河南法治',
    '河南电视剧', '河南新闻', '河南公共', '河南乡村', '中华功夫', '收藏天下', '河南戏曲', '移动电视', '郑州新闻综合',
    '郑州商都', '郑州文体', '郑州戏曲', '郑州妇女', '郑州都市生活', '郑州市教育电视台', '新密综合', '登封综合',
    '中牟综合', '巩义综合', '新郑综合', 'CETV1', 'CETV2', 'CETV4', '山东教育', '北京纪实科教', '国学', 'IPTV国学',
    'IPTV地理', 'IPTV美妆', 'IPTV爱综艺', 'IPTV收视指南', 'IPTV足球', 'IPTV爱体育', 'IPTV好学生', 'IPTV野外',
    'IPTV爱生活', 'IPTV早教', 'IPTV高网', 'IPTV军事', 'IPTV法治', 'IPTV音乐现场', 'IPTV相声小品', '中华特产',
    '先锋乒羽',
]; // 保留频道名称

// 检查是否为合法 GZ 格式
$xmlRaw = @gzdecode(file_get_contents($inputGz));
if ($xmlRaw === false) {
    exit("错误: 无法解压 {$inputGz}，可能不是有效的 gzip 文件\n");
}

// 检查是否为合法 XML
libxml_use_internal_errors(true);
$xml = simplexml_load_string($xmlRaw);
if ($xml === false) {
    echo "错误: XML 解析失败\n";
    foreach (libxml_get_errors() as $error) {
        echo '  - ' . trim($error->message) . "\n";
    }
    exit(1);
}

// 创建新XML结构
$filteredXml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><tv></tv>');
$filteredXml->addAttribute('generator-info-name', $xml['generator-info-name']);
$filteredXml->addAttribute('generator-info-url', $xml['generator-info-url']);

// 找到符合条件的 channel ID
$allowedIds = [];
$channelCount = 0;
$programmeCount = 0;
foreach ($xml->channel as $channel) {
    $name = (string) $channel->{'display-name'};
    if (in_array($name, $allowedChannels, true)) {
        $newChannel = $filteredXml->addChild('channel');
        $newChannel->addAttribute('id', (string) $channel['id']);
        $displayName = $newChannel->addChild('display-name', htmlspecialchars($name));
        $displayName->addAttribute('lang', 'zh');
        $allowedIds[] = (string) $channel['id'];
        $channelCount++;
    }
}

// 过滤 programme
foreach ($xml->programme as $prog) {
    $channelId = (string) $prog['channel'];
    if (in_array($channelId, $allowedIds, true)) {
        $newProg = $filteredXml->addChild('programme');
        $newProg->addAttribute('start', (string) $prog['start']);
        $newProg->addAttribute('stop', (string) $prog['stop']);
        $newProg->addAttribute('channel', $channelId);
        // 支持多语言标题
        foreach ($prog->children() as $child) {
            $node = $newProg->addChild($child->getName(), htmlspecialchars((string) $child));
            foreach ($child->attributes() as $attrKey => $attrVal) {
                $node->addAttribute($attrKey, (string) $attrVal);
            }
        }
        $programmeCount++;
    }
}

// 保存并压缩
file_put_contents('epg_filtered.xml', $filteredXml->asXML());
file_put_contents($outputGz, gzencode(file_get_contents('epg_filtered.xml')));
unlink('epg_filtered.xml');
chmod($outputGz, 0644);

echo "过滤完成，共包含频道: $channelCount 个，节目: $programmeCount 条\n";
echo "输出文件：$outputGz 可通过 http://[路由IP]/epg_filtered.xml.gz 访问\n";
